package coreValider

import (
	"fmt"
	"regexp"
	"strconv"
	"time"
)

// IsMobile 检查给定的字符串是否符合中国大陆手机号码的标准格式
func IsMobile(phoneNumber string) bool {
	matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, phoneNumber)
	return matched
}

// IsAdult 是否是成年人（生日当天不算成年）
func IsAdult(idCard string, age int) bool {
	if len(idCard) != 18 {
		return false
	}
	birthday := idCard[6:14]
	compareDay := time.Now().AddDate(-age, 0, 0).Format("20060102")
	return birthday < compareDay
}

// IsIdCard 是否是身份证号（大小写不敏感）
func IsIdCard(idCard string) bool {
	if len(idCard) != 18 {
		return false
	}
	digit, err := calculateCheckDigit(idCard[0:17])
	if err != nil {
		return false
	}
	return digit == idCard[17] || digit == idCard[17]-32
}

// 校验码计算所用的权重因子
var weightFactors = []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}

// 对应的校验码
var checkCodes = []byte{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}

// calculateCheckDigit 计算身份证号码的最后一位校验码
func calculateCheckDigit(id string) (byte, error) {
	if len(id) != 17 {
		return 0, fmt.Errorf("身份证号长度应为17位")
	}

	// 计算前17位的加权和
	sum := 0
	for i, char := range id {
		num, err := strconv.Atoi(string(char))
		if err != nil {
			return 0, fmt.Errorf("身份证号包含非法字符")
		}
		sum += num * weightFactors[i]
	}

	// 计算校验码
	mod := sum % 11
	return checkCodes[mod], nil
}
